//权限拦截在路由跳转  导航守卫
import router from '@/router'//不需要导出  只需要代码执行
import store from '@/store'//相当于this.$store
import nprogress from 'nprogress'//引入进度条
import 'nprogress/nprogress.css'

// 前置守卫  next是前置守卫必须执行的钩子  next(放行)  nxet(到某个地址）false) 跳转终止
// next(地址) 跳转到某个地址
// beforeEach afterEach 全局拦截
// 页面  按钮  
const whiteList = ['/login', '/404']//定义白名单
router.beforeEach(async (to, from, next) => {
    nprogress.start()//开启进度条
    if (store.getters.token) {
        //   如果有token 继续判断是不是去登录页
        if (to.path === '/login') {
            //  表示去的是登录页
            next('/') // 跳到主页;
        } else {
            // 当前已经有token，并且没有userinfo
            // 只有放过时候才会获取用户资料
            // 如果当前vuex中有用户资料的id  表示已经有资料
            //    无需获取  如果没有id才需要获取 d
            // if (!store.getters.userId) {
                if (!store.getters.username) {
                    // 由于路由筛选的方法依赖用户的menus,所以必须拿到用户信息。才能做路由筛选
                    // routes.menus就是用户的访问权限点
                // 如果没有id这个值 才会调用 vuex的获取资料的action
                //   async 函数所return 的内容  用await  就可以接收到
                const { roles } = await store.dispatch('user/getUserInfo')
                // routes就是筛选得到的动态路由
                // 动态路由 添加到 路由表中 默认的路由表 只有静态路由 没有动态路由
                // 如果说后续 需要根据用户资料获取数据的话 这里必须改成 同步
                // 筛选用户的可用路由
                // actions中函数 默认是Promise对象 调用这个对象 想要获取返回的值话 必须 加 await或者是then
                // actions是做异步操作的

                const routes = await store.dispatch('permission/filterRoutes', roles.menus)
                // addRoutes  必须 用 next(地址) 不能用next()
                // routes就是筛选得到的动态路由
                // 动态路由 添加到 路由表中 默认的路由表 只有静态路由 没有动态路由

                router.addRoutes(routes)
                // await store.dispatch('user/getUserInfo')
                // dispatch是异步操作

                next(to.path)
                // 相当于跳到对应的地址  相当于多做一次跳转 为什么要多做一次跳转
                // 进门了，但是进门之后我要去的地方的路还没有铺好，直接走，掉坑里，多做一次跳转，再从门外往里进一次，跳转之前 把路铺好，再次进来的时候，路就铺好了
            }
            else{
                next()
            }
            // next() // 直接放行
        }
    } else {
        // 如果没有token
        if (whiteList.indexOf(to.path) > -1) {
            // 如果找到了 表示在在名单里面
            next()
        } else {
            next('/login') // 跳到登录页
        }
    }
    nprogress.done() // 手动强制关闭一次  为了解决 手动切换地址时  进度条的不关闭的问题
})
// 后置守卫
router.afterEach(function () {
    nprogress.done() // 关闭进度条
})